import Vue from 'vue'
// import 'es6-promise/auto'
import VueX from "vuex"
import defaultState from "./state"
import mutations from "./mutations"
import getters from "./getters"
import actions from "./actions"

Vue.use(VueX)

// 创建store

// 每次执行次文件，是不是都在创建一个新的store，容易造成溢出
export default () => {
  const store = new VueX.Store({
    // 此属性只能在测试环境下使用，作用：不允许除了mutations之外的其他形式修改状态
    strict:process.env.NODE_ENV === 'production',
    state:defaultState,
    // mutations定义完成
    mutations:mutations,
    // 数据过滤
    getters:getters,
    actions:actions,
    // 在开发中，可能有一些其他的需求，在获取或修改数据前要做某种操作
    plugins:[
      (store) => {
        console.log("最早执行的形式,插件");
      }
    ],
    // 子模块
    modules:{
      moduleA:{
        // 命名空间
        namespaced: true,
        state:{
          countA:10
        },
        mutations:{
          // 因为moudle是共享的
          moduleAIncrement(state,num){
            state.countA += num
          }
        },
        actions:{
          moduleAActionsIncrement({state,commit,rootState}){
            commit("moduleAIncrement",rootState.count)
          }
        },
        getters:{
          // getters:自己本身函数名称
          getModuleACount(state,getters,rootState){
            if(state.countA < 0 ){
              return state.countA = 0;
            }
            return state.countA + rootState.count
          }
        }
      },
      moduleB:{
        state:{
          countB:100
        }
      }
    }

  })

  // 热重载
  if(module.hot){
    // 使 action 和 mutation 成为可热重载模块
    module.hot.accept([
      "./state",
      "./mutations",
      "./getters",
      "./actions"
    ],() => {
      // 获取更新后的模块
      // 因为 babel 6 的模块编译格式问题，这里需要加上 `.default`
      const newActions = require('./actions').default
      const newMutations = require('./mutations').default
      const newGetters = require('./getters').default
      const newState = require('./state').default
      // 加载新模块
      store.hotUpdate({
        state:newState,
        mutations:newMutations,
        actions:newActions,
        getters:newGetters
      })
    })
  }

  return store;
}
